// 购物车模块
import { mergeCartGoods } from '@/api/cart'
import { getCartList } from '@/api/cart'
import { getUpdateCart } from '@/api/cart'
import { getAddCart } from '@/api/cart'
import { deleteCartSet } from '@/api/cart'
import { selectedCart } from '@/api/cart'
import { setCartGoods } from '@/api/cart'
export default {
  namespaced: true,
  state () {
    return {
      // 购物车商品列表
      list: []
    }
  },
  mutations : {
    // 增加购物车商品
    insertCart(state,payload) {
      // 找sku商品是否存在，通过索引判断-> 存在就得到索引-> 删除以前的，给数量增加，重新给最前面添加
      const sameIndex = state.list.findIndex(goods => goods.skuId === payload.skuId)
      if(sameIndex > -1){
        // 得到当前商品的数量 
        const count = state.list[sameIndex].count
        payload.count += count//最终商品数量
        state.list.splice(sameIndex, 1)
      }
      state.list.unshift(payload)
      console.log('成功了？');
    },
    // 更新购物车 -- 购物车初始化
    updateCart(state,goods){
      const update = state.list.find(item => item.skuId === goods.skuId)
      for(let key in goods){
        if(update !== undefined && update !== null && update !== ''){
          update[key] = goods[key]
        }
      }
    },
    // 删除购物车商品
    deleteCart(state,skuId){
      const index = state.list.findIndex(item => item.skuId === skuId)
      state.list.splice(index,1)
    },
    // 购物车商品设置或者清除
    setCart(state,payload){
      state.list = payload
    }
  },
  getters:{
      // 有效的商品列表
      valid(state){
        return state.list.filter(item => item.stock > 0 && item.isEffective )
      },
      // 有效商品的总件数
      validTotal(state,getters){
        return getters.valid.reduce((p,c)=> p + c.count, 0)
      },
      // 有效商品的总金额
      validMoney(state,getters){
        return getters.valid.reduce((p,c)=> p + c.count * c.nowPrice * 100, 0)/100
      },
      // 无效商品列表
      invalid(state){
        return  state.list.filter(item => item.stock < 0 && !item.isEffective)
      },
      // 选中商品列表
      selectedCart(state,getters){
        return getters.valid.filter(item => item.selected)
      },
      // 选中商品的总件数
      selectedCartTotal(state,getters){
        return getters.selectedCart.reduce((p, c) => p + c.count, 0)
      },
      // 选中商品的总金额  ?????
      selectedCartMoney(state,getters){
        // return getters.selectedCartTotal.reduce((p, c)=> p + (c.nowPrice * 100),0)/100
        return getters.selectedCart.reduce((p,c) => p + c.count * c.price * 100,0)/100
      },
      // 是否全选
      isCheckAll(state, getters){
        return getters.valid.length === getters.selectedCart.length && getters.valid.length !== 0
      },
    },
  
  actions:{
    // 合并购物车  -->  找到本地购物车商品的参数 -->  调用合并购物车接口(传参数)   -->   本地商品清空
      async mergeLocalCart(context){
      const cartList = context.getters.valid.map(({skuId,count,selected})=>{
        return {skuId,count,selected}
      })
      await mergeCartGoods(cartList)
      context.commit('setCart',[])
      },

    // 加入购物车 -- 从后台拿到商品信息，异步，promise
      insertCart(context,goods) {
      return new Promise((resolve,reject)=>{
        // 登录
        if(context.rootState.user.profile.token){
          // getAddCart(goods).then(data =>{
          //   context.commit('insertCart',data.result)
          //   resolve()
          // })
          getAddCart(goods).then(()=>{
            return getCartList()
          }).then(data=>{
            context.commit('setCart',data.result)
            resolve()
          })
        }else{
          // 未登录
          context.commit('insertCart',goods)
          resolve()
        }
      })
    },

    // 更新购物车 --> 获取购物车列表
    FindupdateCart(context){
      return new Promise((resolve,reject)=>{
        if(context.rootState.user.profile.token){
          getCartList().then(data=>{
            console.log(data.result,'data.result')
            context.commit('setCart',data.result)
            resolve()
          })
        }else {
          // 未登录  得到的是一个Promise
        let PromiseArr = context.state.list.map(item => {
          // debugger
          return getUpdateCart(item.skuId)
        })
        Promise.all(PromiseArr).then(dataList => {
          dataList.forEach((data,i)=>{
            context.commit('updateCart',{skuId:context.state.list[i].skuId,...data.result})
          })
          resolve()
        })
      } 
      })
    },

    // 删除购物车商品
    deleteCart(context,skuId){
      return new Promise((reslove,reject)=>{
        // 登录
        if(context.rootState.user.profile.token){
          deleteCartSet([skuId]).then(()=>{
            return getCartList()
          }).then(data=>{
            context.commit('setCart',data.result)
            reslove()
          })
        }else{
        // 未登录
        context.commit('deleteCart',skuId)
        reslove()
        }
      })
    },

    // 单选
    checkedOne(context,payload){
      return new Promise((reslove,reject)=>{
        // 登录
        if(context.rootState.user.profile.token){
          // const {skuId, count, selected} = payload
          selectedCart(payload).then(()=>{
            return getCartList()
          }).then(data=>{
            context.commit('setCart',data.result)
            
          })
        }else{
        // 未登录
        context.commit('updateCart',payload)
        reslove()
        }
      })
    },
    // 全选
    checkedAll(context,selected){
      return new Promise((reslove,reject)=>{
        // 登录
        if(context.rootState.user.profile.token){
          setCartGoods({selected}).then(() => {
            return getCartList()
          }).then(data=>{
            context.commit('setCart',data.result)
          })
        }else{
        // 未登录
        // 遍历所有的有效商品列表,设置selected
        context.getters.valid.forEach(item => {
          context.commit('updateCart',{skuId:item.skuId,selected})
        })
        reslove()
        }
      })
    },
    // 批量删除选中的商品
    deleteSelectedCart(context,isClear){
      return new Promise((reslove,reject)=>{
        // 登录
        if(context.rootState.user.profile.token){
          const ids = context.getters[isClear ? 'invalid' : 'selectedCart'].map(item => item.skuId)
          deleteCartSet(ids).then(()=>{
            return getCartList()
          }).then(data=>{
            context.commit('setCart',data.result)
            reslove()
          })
        // 未登录
        context.getters[isClear ? 'invalid' : 'selectedCart'].forEach(item => {
          context.commit('deleteCart',item.skuId)
        })
        reslove()
        }
      })
    },
    updateCartFn(context,goods){
      return new Promise((reslove,reject)=>{
        // 登录
        if(context.rootState.user.profile.token){
          selectedCart(goods).then(()=>{
            return getCartList()
          }).then(data=>{
            context.commit('setCart',data.result)
            
          })
        }else{
        // 未登录
        context.commit('updateCart',goods)
        reslove()
        }
      })
    },
    // 修改购物车规格
    updateCartSku(context,{oldSkuId, newSku}){
      return new Promise((resolve,reject)=>{
        if(context.rootState.user.profile.token){
          //找到旧的商品信息 --> 删除旧的skuId,保存count --> 得到新的与旧的商品的集合 --> 给setCart
          const oldgoods = context.state.list.find(item=>item.skuId === oldSkuId)
          deleteCartSet([oldSkuId]).then(()=>{
            return getAddCart({count:oldgoods.count,skuId:newSku.skuId})
          }).then(()=>{
            return getCartList()
          }).then(data=>{
            console.log(data.reduce,'getData');
            context.commit('setCart',data.result)
            resolve()
          })
        }else{
          // 注意:这里面的参数要与组件传过来的参数名一致，不然会报错
          const oldGoods = context.state.list.find(item => item.skuId === oldSkuId)
          context.commit('deleteCart',oldSkuId)
          console.log(newSku,'newSku')
          const {skuId, price:nowPrice, inventory:stock, specText:attrsText } = newSku
          const newGoods = {...oldGoods,skuId, nowPrice, stock, attrsText}
          console.log(newGoods,'newGoods')
          context.commit('insertCart',newGoods)
          resolve()
        }
      })
    }

  }
}
